# -- coding: utf-8 --
# @time : 2023/10/26 15:24
# @author : zuoyou
# @file : db.py
# @software: pycharm

import os
import sys
import pymysql
import redis
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from dbutils.pooled_db import PooledDB
from config import TheMysqlConfig, TheRedisConfig



class MysqlConnectionPool:
    def __init__(self, maxconnections: int = 4, mincached: int = 0, maxcached: int = 0,
                 maxusage: int = 0, mark: bool = False, blocking: bool = True):
        """
        初始化数据库连接池对象。
        :param maxconnections: 连接池的最大连接数
        :param mincached: 连接池中的最小空闲连接数
        :param maxcached: 连接池中的最大空闲连接数
        :param maxusage: 个连接的最大使用次数，指定单个连接的最大查询次数，超过该次数连接将被关闭重新创建
        :param mark: mark为True，查询语句的返回结果为dict
        :param blocking: 如果连接池中的连接都被占用，是否阻塞等待可用连接
        """
        self.pool = PooledDB(pymysql, **{
            'host': TheMysqlConfig.HOST,
            'port': TheMysqlConfig.PORT,
            'user': TheMysqlConfig.USER,
            'password': TheMysqlConfig.PASSWORD,
            'database': TheMysqlConfig.DATABASE,
            'charset': TheMysqlConfig.CHARSET,
            'maxconnections': maxconnections,  # 连接池允许的最大连接数
            'mincached': mincached,  # 初始化连接池时创建的连接数。默认为0，即初始化时不创建连接
            'maxcached': maxcached,  # 连接池中空闲连接的最大数量。默认0，即无最大数量限制
            'maxusage': maxusage,  # 连接的最大使用次数。默认0，即无使用次数限制
            'blocking': blocking  # 连接数达到最大时，新连接是否可阻塞。默认False，即达到最大连接数时，再取新连接将会报错
        })
        self.mark = mark

    def get_conn_curs(self, mark: bool = False):
        """获取连接、游标"""
        if mark:
            self.mark = mark
        conn = self.pool.connection()
        cursor = conn.cursor(pymysql.cursors.DictCursor) if self.mark else conn.cursor()
        return conn, cursor

    def close_conn_curs(self, conn, curs):
        """关闭游标、连接"""
        curs.close()
        conn.close()


class RedisHelper:
    def __init__(self, db=1):
        if db:
            TheRedisConfig.REDIS_PARAMS['db'] = db
        self.conn = redis.Redis(TheRedisConfig.REDIS_HOST, TheRedisConfig.REDIS_PORT,
                                **TheRedisConfig.REDIS_PARAMS)

    def get_conn(self):
        return self.conn


